// 自定义类型
package main

// import "fmt"
// //类型定义
// type NewInt int
// //类型别名
// type MyInt = int

// type person struct{
// 	name string
// 	city string
// 	age int8
// }
// func main() {
//     var a NewInt
//     var b MyInt

//     fmt.Printf("type of a:%T\n", a) //type of a:main.NewInt
//     fmt.Printf("type of b:%T\n", b) //type of b:int
// 	// 结果显示a的类型是main.NewInt，
// 	// 表示main包下定义的NewInt类型。
// 	// b的类型是int。
// 	// MyInt类型只会在代码中存在，编译完成时并不会有MyInt类型

// 	fmt.Println("-------构建基本实例化类型---------")
// 	var p1 person
// 	p1.name = " pprof"
// 	p1.city = "北京"
// 	p1.age = 19
// 	fmt.Printf("p1 = %v\n	", p1)
// 	fmt.Printf("p1 = %#v\n	", p1)

// 	fmt.Println("--------构建匿名结构体----------")
// 	var user struct{name string; age int}
// 	user.age = 19
// 	user.name = "zdajka"
// 	fmt.Printf("%#v \n", user)


// 	// 我们还可以通过使用new关键字对结构体进行实例化，得到的是结构体的地址
// 	var p2 = new(person)
// 	fmt.Printf("%T \n", p2)
// 	fmt.Printf("p2 = %#v	\n", p2)
// 	p2.name = "测试"
// 	p2.age = 20
// 	p2.city = "南京"
// 	fmt.Printf("p2 = %#v \n", p2)
// 	// /p2=&main.person{name:"测试", city:"南京", age:20}

// // 使用&对结构体进行取地址操作相当于对该结构体类型进行了一次new实例化操作。
// 	p3 := &person{}
// 	p3.name = "博客"
// 	p3.age = 30
// 	p3.city = "成都"
// 	fmt.Printf("p3 = %#v\n", p3)

// 	// 使用键值对初始化, 当然有些字段没有的话，也是可以不用写的
// 	p4 := person{
// 		name: "profff",
// 		city: "上海",
// 	}
// 	fmt.Printf("p4 = %#v\n", p4)

// 	// 也可以对结构体指针进行键值对初始化.
// 	p5 := &person{
// 		name: "pprof.cn",
// 		city: "北京",
// 		age:  18,
// 	}
// 	fmt.Printf("p6=%#v\n", p5) 
// // 对于初始化环境手法， 也可以进行简写的的. 但是要注意
// // 使用这种格式初始化时，需要注意：
// // 1.必须初始化结构体的所有字段。
// // 2.初始值的填充顺序必须与字段在结构体中的声明顺序一致。
// // 3.该方式不能和键值初始化方式混用。
// 	p6 := &person{
// 		"pprof.cn",
// 		"北京",
// 		18,
// 	}
// 	fmt.Printf("p8=%#v\n", p6) 


// }
